<?php

/**
 * Debugger bluescreen template.
 *
 * This file is part of the Nette Framework (http://nette.org)
 * Copyright (c) 2004, 2010 David Grudl (http://davidgrudl.com)
 *
 * @param      array     $exception
 * @param      array     $panels
 * @return     void
 */

namespace Nette\Diagnostics;

use Nette;



/**
 * Page title.
 */
static $errorTypes = array(
	E_ERROR => 'Fatal Error',
	E_USER_ERROR => 'User Error',
	E_RECOVERABLE_ERROR => 'Recoverable Error',
	E_CORE_ERROR => 'Core Error',
	E_COMPILE_ERROR => 'Compile Error',
	E_PARSE => 'Parse Error',
	E_WARNING => 'Warning',
	E_CORE_WARNING => 'Core Warning',
	E_COMPILE_WARNING => 'Compile Warning',
	E_USER_WARNING => 'User Warning',
	E_NOTICE => 'Notice',
	E_USER_NOTICE => 'User Notice',
	E_STRICT => 'Strict',
	E_DEPRECATED => 'Deprecated',
	E_USER_DEPRECATED => 'User Deprecated',
);

$title = ($exception instanceof Nette\FatalErrorException && isset($errorTypes[$exception->getSeverity()])) ? $errorTypes[$exception->getSeverity()] : get_class($exception);

$expandPath = NETTE_DIR . DIRECTORY_SEPARATOR; // . 'Utils' . DIRECTORY_SEPARATOR . 'Object';
$counter = 0;

?><!-- "' --></script></style></pre></xmp></table>
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<meta name="robots" content="noindex,noarchive">
	<meta name="generator" content="Nette Framework">

	<title><?php echo htmlspecialchars($title) ?></title><!-- <?php
		$ex = $exception; echo $ex->getMessage(), ($ex->getCode() ? ' #' . $ex->getCode() : '');
		while ((method_exists($ex, 'getPrevious') && $ex = $ex->getPrevious()) || (isset($ex->previous) && $ex = $ex->previous)) echo '; caused by ', get_class($ex), ' ', $ex->getMessage(), ($ex->getCode() ? ' #' . $ex->getCode() : '');
	?> -->

	<style type="text/css" class="nette">

		html {
			overflow-y: scroll;
		}

		body {
			margin: 0 0 2em;
			padding: 0;
		}

		#netteBluescreen {
			font: 9pt/1.5 Verdana, sans-serif;
			background: white;
			color: #333;
			position: absolute;
			left: 0;
			top: 0;
			width: 100%;
			z-index: 23178;
			text-align: left;
		}

		#netteBluescreen * {
			font: inherit;
			color: inherit;
			background: transparent;
			border: none;
			margin: 0;
			padding: 0;
			text-align: inherit;
			text-indent: 0;
		}

		#netteBluescreen b {
			font-weight: bold;
		}

		#netteBluescreen i {
			font-style: italic;
		}

		#netteBluescreen a {
			text-decoration: none;
			color: #328ADC;
			padding: 2px 4px;
			margin: -2px -4px;
		}

		#netteBluescreen a:hover, #netteBluescreen a:active, #netteBluescreen a:focus {
			color: #085AA3;
		}

		#netteBluescreen a abbr {
			font-family: sans-serif;
			color: #BBB;
		}

		#netteBluescreenIcon {
			position: absolute;
			right: .5em;
			top: .5em;
			z-index: 23179;
			text-decoration: none;
			background: #CD1818;
			padding: 3px;
		}

		#netteBluescreenError {
			background: #CD1818;
			color: white;
			font: 13pt/1.5 Verdana, sans-serif !important;
			display: block;
		}

		#netteBluescreenError #netteBsSearch {
			color: #CD1818;
			font-size: .7em;
		}

		#netteBluescreenError:hover #netteBsSearch {
			color: #ED8383;
		}

		#netteBluescreen h1 {
			font-size: 18pt;
			font-weight: normal;
			text-shadow: 1px 1px 0 rgba(0, 0, 0, .4);
			margin: .7em 0;
		}

		#netteBluescreen h2 {
			font: 14pt/1.5 sans-serif !important;
			color: #888;
			margin: .6em 0;
		}

		#netteBluescreen h3 {
			font: bold 10pt/1.5 Verdana, sans-serif !important;
			margin: 1em 0;
			padding: 0;
		}

		#netteBluescreen p, #netteBluescreen pre {
			margin: .8em 0
		}

		#netteBluescreen pre, #netteBluescreen code, #netteBluescreen table {
			font: 9pt/1.5 Consolas, monospace !important;
		}

		#netteBluescreen pre, #netteBluescreen table {
			background: #FDF5CE;
			padding: .4em .7em;
			border: 1px dotted silver;
			overflow: auto;
		}

		#netteBluescreen table pre {
			padding: 0;
			margin: 0;
			border: none;
		}

		#netteBluescreen pre .php-array, #netteBluescreen pre .php-object {
			color: #C22;
		}

		#netteBluescreen pre .php-string {
			color: #080;
		}

		#netteBluescreen pre .php-int, #netteBluescreen pre .php-float, #netteBluescreen pre .php-null, #netteBluescreen pre .php-bool {
			color: #328ADC;
		}

		#netteBluescreen pre .php-visibility {
			font-size: 85%;
			color: #998;
		}

		#netteBluescreen pre.nette-dump a {
			color: #333;
		}

		#netteBluescreen div.panel {
			padding: 1px 25px;
		}

		#netteBluescreen div.inner {
			background: #F4F3F1;
			padding: .1em 1em 1em;
			border-radius: 8px;
			-moz-border-radius: 8px;
			-webkit-border-radius: 8px;
		}

		#netteBluescreen table {
			border-collapse: collapse;
			width: 100%;
		}

		#netteBluescreen .outer {
			overflow: auto;
		}

		#netteBluescreen td, #netteBluescreen th {
			vertical-align: top;
			text-align: left;
			padding: 2px 6px;
			border: 1px solid #e6dfbf;
		}

		#netteBluescreen th {
			width: 10%;
			font-weight: bold;
		}

		#netteBluescreen tr:nth-child(2n), #netteBluescreen tr:nth-child(2n) pre {
			background-color: #F7F0CB;
		}

		#netteBluescreen ol {
			margin: 1em 0;
			padding-left: 2.5em;
		}

		#netteBluescreen ul {
			font: 7pt/1.5 Verdana, sans-serif !important;
			padding: 2em 4em;
			margin: 1em 0 0;
			color: #777;
			background: #F6F5F3 url('') 99% 10px no-repeat;
			border-top: 1px solid #DDD;
		}

		#netteBluescreen .highlight {
			background: #CD1818;
			color: white;
			font-weight: bold;
			font-style: normal;
			display: block;
			padding: 0 .4em;
			margin: 0 -.4em;
		}

		#netteBluescreen .line {
			color: #9F9C7F;
			font-weight: normal;
			font-style: normal;
		}

		#netteBluescreen a[href^=editor\:] {
			color: inherit;
			border-bottom: 1px dotted #C1D2E1;
		}
	</style>
</head>



<body>
<div id="netteBluescreen">
	<a id="netteBluescreenIcon" href="#" rel="next"><abbr>&#x25bc;</abbr></a

	><div>
		<div id="netteBluescreenError" class="panel">
			<h1><?php echo htmlspecialchars($title), ($exception->getCode() ? ' #' . $exception->getCode() : '') ?></h1>

			<p><?php echo htmlspecialchars($exception->getMessage()) ?> <a href="http://www.google.cz/search?sourceid=nette&amp;q=<?php echo urlencode($title . ' ' . preg_replace('#\'.*\'|".*"#Us', '', $exception->getMessage())) ?>" id="netteBsSearch">search&#x25ba;</a></p>
		</div>



		<?php $ex = $exception; $level = 0; ?>
		<?php do { ?>

			<?php if ($level++): ?>
			<div class="panel">
			<h2><a href="#" rel="netteBsPnl<?php echo ++$counter ?>">Caused by <abbr><?php echo ($collapsed = $level > 2) ? '&#x25ba;' : '&#x25bc;' ?></abbr></a></h2>

			<div id="netteBsPnl<?php echo $counter ?>" class="<?php echo $collapsed ? 'nette-collapsed ' : '' ?>inner">
				<div class="panel">
					<h1><?php echo htmlspecialchars(get_class($ex)), ($ex->getCode() ? ' #' . $ex->getCode() : '') ?></h1>

					<p><b><?php echo htmlspecialchars($ex->getMessage()) ?></b></p>
				</div>
			<?php endif ?>



			<?php foreach ($panels as $panel): ?>
			<?php $panel = call_user_func($panel, $ex); if (empty($panel['tab']) || empty($panel['panel'])) continue; ?>
			<div class="panel">
				<h2><a href="#" rel="netteBsPnl<?php echo ++$counter ?>"><?php echo htmlSpecialChars($panel['tab']) ?> <abbr>&#x25bc;</abbr></a></h2>

				<div id="netteBsPnl<?php echo $counter ?>" class="inner">
				<?php echo $panel['panel'] ?>
			</div></div>
			<?php endforeach ?>



			<?php $stack = $ex->getTrace(); $expanded = NULL ?>
			<?php if (strpos($ex->getFile(), $expandPath) === 0) {
				foreach ($stack as $key => $row) {
					if (isset($row['file']) && strpos($row['file'], $expandPath) !== 0) { $expanded = $key; break; }
				}
			} ?>

			<div class="panel">
			<h2><a href="#" rel="netteBsPnl<?php echo ++$counter ?>">Source file <abbr><?php echo ($collapsed = $expanded !== NULL) ? '&#x25ba;' : '&#x25bc;' ?></abbr></a></h2>

			<div id="netteBsPnl<?php echo $counter ?>" class="<?php echo $collapsed ? 'nette-collapsed ' : '' ?>inner">
				<p><b>File:</b> <?php echo Helpers::editorLink($ex->getFile(), $ex->getLine()) ?> &nbsp; <b>Line:</b> <?php echo $ex->getLine() ?></p>
				<?php if (is_file($ex->getFile())): ?><pre><?php echo self::highlightFile($ex->getFile(), $ex->getLine(), 15, isset($ex->context) ? $ex->context : NULL) ?></pre><?php endif ?>
			</div></div>



			<?php if (isset($stack[0]['class']) && $stack[0]['class'] === 'Nette\Diagnostics\Debugger' && ($stack[0]['function'] === '_shutdownHandler' || $stack[0]['function'] === '_errorHandler')) unset($stack[0]) ?>
			<?php if ($stack): ?>
			<div class="panel">
				<h2><a href="#" rel="netteBsPnl<?php echo ++$counter ?>">Call stack <abbr>&#x25bc;</abbr></a></h2>

				<div id="netteBsPnl<?php echo $counter ?>" class="inner">
				<ol>
					<?php foreach ($stack as $key => $row): ?>
					<li><p>

					<?php if (isset($row['file']) && is_file($row['file'])): ?>
						<?php echo Helpers::editorLink($row['file'], $row['line']), ':', $row['line'] ?>
					<?php else: ?>
						<i>inner-code</i><?php if (isset($row['line'])) echo ':', $row['line'] ?>
					<?php endif ?>

					<?php if (isset($row['file']) && is_file($row['file'])): ?><a href="#" rel="netteBsSrc<?php echo "$level-$key" ?>">source <abbr>&#x25ba;</abbr></a>&nbsp; <?php endif ?>

					<?php if (isset($row['class'])) echo $row['class'] . $row['type'] ?>
					<?php echo $row['function'] ?>

					(<?php if (!empty($row['args'])): ?><a href="#" rel="netteBsArgs<?php echo "$level-$key" ?>">arguments <abbr>&#x25ba;</abbr></a><?php endif ?>)
					</p>

					<?php if (!empty($row['args'])): ?>
						<div class="nette-collapsed outer" id="netteBsArgs<?php echo "$level-$key" ?>">
						<table>
						<?php
						try {
							$r = isset($row['class']) ? new \ReflectionMethod($row['class'], $row['function']) : new \ReflectionFunction($row['function']);
							$params = $r->getParameters();
						} catch (\Exception $e) {
							$params = array();
						}
						foreach ($row['args'] as $k => $v) {
							echo '<tr><th>', (isset($params[$k]) ? '$' . $params[$k]->name : "#$k"), '</th><td>';
							echo Helpers::clickableDump($v);
							echo "</td></tr>\n";
						}
						?>
						</table>
						</div>
					<?php endif ?>


					<?php if (isset($row['file']) && is_file($row['file'])): ?>
						<pre <?php if ($expanded !== $key) echo 'class="nette-collapsed"'; ?> id="netteBsSrc<?php echo "$level-$key" ?>"><?php echo self::highlightFile($row['file'], $row['line']) ?></pre>
					<?php endif ?>

					</li>
					<?php endforeach ?>
				</ol>
			</div></div>
			<?php endif ?>



			<?php if (isset($ex->context) && is_array($ex->context)):?>
			<div class="panel">
			<h2><a href="#" rel="netteBsPnl<?php echo ++$counter ?>">Variables <abbr>&#x25ba;</abbr></a></h2>

			<div id="netteBsPnl<?php echo $counter ?>" class="nette-collapsed inner">
			<div class="outer">
			<table>
			<?php
			foreach ($ex->context as $k => $v) {
					echo '<tr><th>$', htmlspecialchars($k), '</th><td>', Helpers::clickableDump($v), "</td></tr>\n";
			}
			?>
			</table>
			</div>
			</div></div>
			<?php endif ?>

		<?php } while ((method_exists($ex, 'getPrevious') && $ex = $ex->getPrevious()) || (isset($ex->previous) && $ex = $ex->previous)); ?>
		<?php while (--$level) echo '</div></div>' ?>



		<?php foreach ($panels as $panel): ?>
		<?php $panel = call_user_func($panel, NULL); if (empty($panel['tab']) || empty($panel['panel'])) continue; ?>
		<div class="panel">
			<h2><a href="#" rel="netteBsPnl<?php echo ++$counter ?>"><?php echo htmlSpecialChars($panel['tab']) ?> <abbr>&#x25ba;</abbr></a></h2>

			<div id="netteBsPnl<?php echo $counter ?>" class="nette-collapsed inner">
			<?php echo $panel['panel'] ?>
		</div></div>
		<?php endforeach ?>



		<div class="panel">
		<h2><a href="#" rel="netteBsPnl<?php echo ++$counter ?>">Environment <abbr>&#x25ba;</abbr></a></h2>

		<div id="netteBsPnl<?php echo $counter ?>" class="nette-collapsed inner">
			<?php
			$list = get_defined_constants(TRUE);
			if (!empty($list['user'])):?>
			<h3><a href="#" rel="netteBsPnl-env-const">Constants <abbr>&#x25bc;</abbr></a></h3>
			<div class="outer">
			<table id="netteBsPnl-env-const">
			<?php
			foreach ($list['user'] as $k => $v) {
				echo '<tr><th>', htmlspecialchars($k), '</th>';
				echo '<td>', Helpers::clickableDump($v), "</td></tr>\n";
			}
			?>
			</table>
			</div>
			<?php endif ?>


			<h3><a href="#" rel="netteBsPnl-env-files">Included files <abbr>&#x25ba;</abbr></a> (<?php echo count(get_included_files()) ?>)</h3>
			<div class="outer">
			<table id="netteBsPnl-env-files" class="nette-collapsed">
			<?php
			foreach (get_included_files() as $v) {
				echo '<tr><td>', htmlspecialchars($v), "</td></tr>\n";
			}
			?>
			</table>
			</div>


			<h3>$_SERVER</h3>
			<?php if (empty($_SERVER)):?>
			<p><i>empty</i></p>
			<?php else: ?>
			<div class="outer">
			<table>
			<?php
			foreach ($_SERVER as $k => $v) echo '<tr><th>', htmlspecialchars($k), '</th><td>', Helpers::clickableDump($v), "</td></tr>\n";
			?>
			</table>
			</div>
			<?php endif ?>
		</div></div>



		<div class="panel">
		<h2><a href="#" rel="netteBsPnl<?php echo ++$counter ?>">HTTP request <abbr>&#x25ba;</abbr></a></h2>

		<div id="netteBsPnl<?php echo $counter ?>" class="nette-collapsed inner">
			<?php if (function_exists('apache_request_headers')): ?>
			<h3>Headers</h3>
			<div class="outer">
			<table>
			<?php
			foreach (apache_request_headers() as $k => $v) echo '<tr><th>', htmlspecialchars($k), '</th><td>', htmlspecialchars($v), "</td></tr>\n";
			?>
			</table>
			</div>
			<?php endif ?>


			<?php foreach (array('_GET', '_POST', '_COOKIE') as $name): ?>
			<h3>$<?php echo $name ?></h3>
			<?php if (empty($GLOBALS[$name])):?>
			<p><i>empty</i></p>
			<?php else: ?>
			<div class="outer">
			<table>
			<?php
			foreach ($GLOBALS[$name] as $k => $v) echo '<tr><th>', htmlspecialchars($k), '</th><td>', Helpers::clickableDump($v), "</td></tr>\n";
			?>
			</table>
			</div>
			<?php endif ?>
			<?php endforeach ?>
		</div></div>



		<div class="panel">
		<h2><a href="#" rel="netteBsPnl<?php echo ++$counter ?>">HTTP response <abbr>&#x25ba;</abbr></a></h2>

		<div id="netteBsPnl<?php echo $counter ?>" class="nette-collapsed inner">
			<h3>Headers</h3>
			<?php if (headers_list()): ?>
			<pre><?php
			foreach (headers_list() as $s) echo htmlspecialchars($s), '<br>';
			?></pre>
			<?php else: ?>
			<p><i>no headers</i></p>
			<?php endif ?>
		</div></div>


		<ul>
			<li>Report generated at <?php echo @date('Y/m/d H:i:s', Debugger::$time) ?></li>
			<?php if (preg_match('#^https?://#', Debugger::$source)): ?>
				<li><a href="<?php echo htmlSpecialChars(Debugger::$source) ?>"><?php echo htmlSpecialChars(Debugger::$source) ?></a></li>
			<?php elseif (Debugger::$source): ?>
				<li><?php echo htmlSpecialChars(Debugger::$source) ?></li>
			<?php endif ?>
			<li>PHP <?php echo htmlSpecialChars(PHP_VERSION) ?></li>
			<?php if (isset($_SERVER['SERVER_SOFTWARE'])): ?><li><?php echo htmlSpecialChars($_SERVER['SERVER_SOFTWARE']) ?></li><?php endif ?>
			<?php if (class_exists('Nette\Framework')): ?><li><?php echo htmlSpecialChars('Nette Framework ' . Nette\Framework::VERSION) ?> <i>(revision <?php echo htmlSpecialChars(Nette\Framework::REVISION) ?>)</i></li><?php endif ?>
		</ul>
	</div>
</div>

<script type="text/javascript">
	var bs = document.getElementById('netteBluescreen');
	document.body.appendChild(bs);
	document.onkeyup = function(e) {
		e = e || window.event;
		if (e.keyCode == 27 && !e.shiftKey && !e.altKey && !e.ctrlKey && !e.metaKey) {
			bs.onclick({target: document.getElementById('netteBluescreenIcon')});
		}
	};

	for (var i = 0, styles = document.styleSheets; i < styles.length; i++) {
		if ((styles[i].owningElement || styles[i].ownerNode).className !== 'nette') {
			styles[i].oldDisabled = styles[i].disabled;
			styles[i].disabled = true;

		} else if (styles[i].addRule) {
			styles[i].addRule('.nette-collapsed', 'display: none');
		} else {
			styles[i].insertRule('.nette-collapsed { display: none }', 0);
		}
	}

	bs.onclick = function(e) {
		e = e || window.event;
		var link = e.target || e.srcElement;
		while (link && link.tagName && link.tagName.toLowerCase() !== 'a') {
			link = link.parentNode;
		}
		if (!link || !link.rel) {
			return true;
		}
		var arrow = link.getElementsByTagName('abbr')[0];
		var panel = link.rel === 'next' ? link.nextSibling : document.getElementById(link.rel);
		while (panel.nodeType !== 1) panel = panel.nextSibling;
		var collapsed = panel.currentStyle ? panel.currentStyle.display == 'none' : getComputedStyle(panel, null).display == 'none';

		try { arrow.innerHTML = String.fromCharCode(collapsed ? 0x25bc : 0x25ba); } catch(e){} // ie6
		panel.style.display = collapsed ? (panel.tagName.toLowerCase() === 'code' ? 'inline' : 'block') : 'none';

		if (link.id === 'netteBluescreenIcon') {
			for (var i = 0, styles = document.styleSheets; i < styles.length; i++) {
				if ((styles[i].owningElement || styles[i].ownerNode).className !== 'nette') {
					styles[i].disabled = collapsed ? true : styles[i].oldDisabled;
				}
			}
		}
		return false;
	};
</script>
</body>
</html>
